package doc2db.interfaces.action.open;

import doc2db.fileWorker.FileIO;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.File;
import doc2db.Keey;
import doc2db.interfaces.action.AbstractGUIAction;
import doc2db.interfaces.mainWindow.MyFrame;
import doc2db.interfaces.mainWindow.MyPanel;
import java.awt.event.ActionListener;

/**
 *
 * @author yura
 */
public class MEditPane extends MEditHtmlCreator{//JEditorPane implements CSS{

/////////////////////////////////////////////////////////////////////////
//////////////////// Область объявления   ///////////////////////////////
/////////////////////////////////////////////////////////////////////////

    /** Если выведен файл то true, иначе, если выведен каталог, то false */
    private boolean isFile = false;
    /** Если мышка над гипер ссылкой */
    private boolean isOnHyperLink = false;
    /* * Показывать не видемые файлы
    private boolean showInvisibleFile = true;*/
    /** текст внутри ссылки */
    private String HyperLinkName = "";
    /** имя выведенного файла */
    private static String fileName = "";
    /** список файлов в каталоге, если выведен каталог */
    private String fileList [] = null;

    /** первый временный файл */
    private String tmpFile1 = new File(Keey.TMP, "index1.html").getAbsolutePath();//"/tmp/index1.html";
    /** второй временный файл */
    private String tmpFile2 = new File(Keey.TMP, "index2.html").getAbsolutePath();//"/tmp/index2.html";
    /** определяет какой именно временный файл сейчас открыт */
    private boolean is1 = true;

    /* * вернутся на один каталог выше
    public static final int BACK = Integer.MAX_VALUE / 2;*/

    /** файл который был открыт последним */
    private String tryToOpen = "";

    /**главная панель приложения*/
    private MyPanel pane ;
    private MyFrame frame;

    private ActionListener action = null;

    public ActionListener getAction() {
        return action;
    }

    public void setAction(ActionListener action) {
        this.action = action;
    }

    public MEditPane (MyFrame frame, MyPanel pane) {
        this.frame =frame;
        this.pane = pane;
        setEditable(false);
        setBackground(Color.WHITE);


        final JEditPContentMenu m = new JEditPContentMenu(this);
        addHyperlinkListener(m);
        final MEditPane medit = this;
        
        addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e) {
                if(e.isPopupTrigger()){
                    if (isOnHyperLink) {
                        if (!isFile) {
                            m.hyperLinkName = "" + HyperLinkName;
                            m.getLynkMenu().show(e.getComponent(), e.getX(), e.getY());
                        }else{
                            m.hyperLinkName = "" + HyperLinkName;
                        }
                    } else {
                        if(e.isPopupTrigger())
                        m.getLynkSelectPaneMenu(medit).show(e.getComponent(), e.getX(), e.getY());
                    }
                }
            }
        });

    }


/////////////////////////////////////////////////////////////////////////
////////////////////  Область gets and sets ////////////////////////////
/////////////////////////////////////////////////////////////////////////
// <editor-fold defaultstate="collapsed" desc="get and set methods">
    public String getHyperLinkName() {
        return HyperLinkName;
    }

    public void setHyperLinkName(String HyperLinkName) {
        this.HyperLinkName = HyperLinkName;
    }

    public String[] getFileList() {
        return fileList;
    }

    public void setFileList(String[] fileList) {
        this.fileList = fileList;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public boolean isIsFile() {
        return isFile;
    }

    public void setIsFile(boolean isFile) {
        this.isFile = isFile;
    }

    public boolean isIsOnHyperLink() {
        return isOnHyperLink;
    }

    public void setIsOnHyperLink(boolean isOnHyperLink) {
        this.isOnHyperLink = isOnHyperLink;
    }

    public boolean isShowInvisibleFile() {
        return showInvisibleFile;
    }

    public void setShowInvisibleFile(boolean showInvisibleFile) {
        this.showInvisibleFile = showInvisibleFile;
    }

    public boolean isIs1() {
        return is1;
    }

    public void setIs1(boolean is1) {
        this.is1 = is1;
    }

    public String getTmpFile1() {
        return tmpFile1;
    }

    public void setTmpFile1(String tmpFile1) {
        this.tmpFile1 = tmpFile1;
    }

    public String getTmpFile2() {
        return tmpFile2;
    }

    public void setTmpFile2(String tmpFile2) {
        this.tmpFile2 = tmpFile2;
    }

    public String getTryToOpen() {
        return tryToOpen;
    }

    public void setTryToOpen(String tryToOpen) {
        this.tryToOpen = tryToOpen;
    }// </editor-fold>

/////////////////////////////////////////////////////////////////////////
//////////////////////////  Область Override ////////////////////////////
/////////////////////////////////////////////////////////////////////////

    @Override public void setText(String arg0) {
        super.setText(arg0);
        isFile = false;
    }

    @Override public void setPage(String arg0) throws IOException {
        super.setPage(arg0);
        isFile = false;
    }

/////////////////////////////////////////////////////////////////////////
//////////////////////////  Рабочая область  ////////////////////////////
/////////////////////////////////////////////////////////////////////////

    /**
     * Открыть файл
     * @param i номер файла в каталоге файл
     * @return true если удалось открыть и false в противном случае
     */
    public boolean open (int i){
        System.out.println("open file " + i);
        if (i == BACK) {
            final String parent = new File(fileName).getParent();
            if (parent != null) {
                return open(parent);
            } else {
                return false;
            }
        }
        if (i == PROC){
            if (action != null){
                action.actionPerformed(null);
            }
        }
        if (fileList == null)
            return false;
        if (i < 0)
            return false;
        if (i >= fileList.length)
            return false;
        return this.open(fileName + File.separator + fileList[i]);
    }

    /**
     * Открыть файл
     * @param args файл
     * @param isView Отображать ли файл на панели или только создать его
     * @return true если удалось открыть и false в противном случае
     */
    public boolean open (String args, String prefix, boolean isView){
        System.out.println("open file " + args);
        File file = new File(args);
        String tmpFile = "";
        if (is1){
            tmpFile = tmpFile1 + prefix;
            is1 = false;
        }else {
            tmpFile = tmpFile2 + prefix;
            is1 = true;
        }
        tryToOpen = tmpFile;
        if (!file.exists())
            return false;
        if (file.isDirectory()){
            String s = createDirFile(file);
            if (!FileIO.createFile(s, tmpFile))
                return false;
            fileList = file.list();
            isFile = false;
            isOnHyperLink = false;
            HyperLinkName = "";
            fileName = file.getAbsolutePath();
            if (isView) {
                try {
                    setPage("file://" + tmpFile);
                } catch (IOException ex) {
                    System.err.println(ex);
                    return false;
                }
            }
        }else {
            OpenFile of = new OpenFile(frame, pane);
            AbstractGUIAction.init(of);
            of.openFile(file.getAbsolutePath());
        }
        return true;
    }

    /**
     * Открыть файл
     * @param args файл
     * @return true если удалось открыть и false в противном случае
     */
    public boolean open (String args){
        return open(args, "", true);
    }

    private boolean errorDocToHtml(File input, File output){
        return false;
    }

}
